home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 101-125 / disk_111 / labels / alf.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  4KB  |  212 lines

  1. /*
  2.  *    This program takes two files of alphabetically sorted labels,
  3.  *    and merges them to the standard output.
  4.  *    The lines should be of the form <LABEL> <SPACE(S)> <VALUE>.
  5.  *    In most cases, duplicates will be filtered out.
  6.  */
  7.  
  8. #include <stdio.h>
  9. #define DEBUG
  10. #define FINAL_OUTPUT
  11.  
  12. char line1[80];
  13. char line2[80];
  14.  
  15. char *name1;
  16. char *name2;
  17.  
  18. long value1, value2;
  19.  
  20. #ifdef DEBUG
  21. FILE *dbgchn;
  22. #endif
  23.  
  24. #define negabs(x)    (x>0? -x: x)
  25.  
  26. int freadln(file, line)
  27. register FILE *file;
  28. register char *line;
  29. {
  30.     register int ch = ' ';
  31.     char *linepos = line;
  32.  
  33.     while ((line == linepos) && (ch != EOF)) {    /* Skip empty lines */
  34.         while ((ch = getc(file)) != '\n' && (ch != EOF))
  35.             *linepos++ = ch;
  36.     }
  37.  
  38.     *linepos = '\0';
  39. #ifdef DEBUG
  40.     {
  41.         int filenr = (line == line1)? 1 : 2;
  42.         fprintf(dbgchn, "%d read: `%s'\n", filenr, line);
  43.     }
  44. #endif
  45.  
  46.     return ch == EOF;
  47. }
  48.  
  49. int scanline(file, line, name, value)    /* Name first */
  50. FILE *file;
  51. char *line;
  52. char **name;
  53. long *value;
  54. {
  55.     register char *ch = line;
  56.  
  57.     if ( freadln(file, line) == 0 ) {
  58.         while (*ch == ' ')    ch++;    /* Find beginning of label */
  59.         *name = ch;                    /* Return it */
  60.         while (*ch != ' ')    ch++;    /* Find end of label */
  61.         *ch = '\0';                    /* Null-terminate it */
  62.         if (sscanf(ch+1, "%lx", value) == 1) {    /* Skip name */
  63. #ifdef DEBUG2
  64.             fprintf(dbgchn, "value = %8lx\n", *value);
  65. #endif
  66.             return 0;                /* OK */
  67.         }
  68.     }
  69.     return 1;                        /* BAD */
  70. }
  71.  
  72. int newscanline(file, line, name, value)    /* Value first */
  73. FILE *file;
  74. char *line;
  75. char **name;
  76. long *value;
  77. {
  78.     register char *ch = &line[8];    /* Skip 8 digit value */
  79.  
  80.     if ( freadln(file, line) == 0 ) {
  81.         while (*ch == ' ')    ch++;    /* Find beginning of label */
  82.         *name = ch;                    /* Return it */
  83.         while (*ch != ' ')    ch++;    /* Find end of label */
  84.         *ch = '\0';                    /* Null-terminate it */
  85.         if (sscanf(line, "%lx", value) == 1) {
  86. #ifdef DEBUG2
  87.             fprintf(dbgchn, "value = %8lx\n", *value);
  88. #endif
  89.             return 0;                /* OK */
  90.         }
  91.     }
  92.     return 1;                        /* BAD */
  93. }
  94.  
  95. #ifdef FINAL_OUTPUT
  96. int writeline(name, value)
  97. char *name;
  98. long value;
  99. {
  100.     int i;
  101.  
  102.     if (value & 0xFFFF0000)
  103.         printf("%08lx  ", value);
  104.     else if ((short) value & 0xFF00)
  105.         printf("    %04lx  ", value);
  106.     else
  107.         printf("      %02lx  ", value);
  108.  
  109.     printf(name);
  110.  
  111.     if (negabs(value) > -65536) {
  112.         printf("  ");
  113.         for (i=strlen(name); i < 30; i++)
  114.             putchar('_');
  115.         printf(" %6ld", value);
  116.     }
  117.  
  118.     putchar('\n');
  119.  
  120.     return 0;
  121. }
  122.  
  123. #else
  124.  
  125. int writeline(name, value)
  126. char *name;
  127. long value;
  128. {
  129.     return printf("%-30s  %lx\n", name, value);
  130. }
  131.  
  132. #endif
  133.  
  134. main(argc, argv)
  135. int argc;
  136. char *argv[];
  137. {
  138.     FILE *file1, *file2, *file;
  139.  
  140.     int comp;
  141.     int finished = 0;
  142.  
  143.     if (argc != 3) {
  144.         fprintf(stderr, "Usage: %s file1 file2\n", argv[0]);
  145.         exit(1);
  146.     }
  147.  
  148.     if ((file1 = fopen(argv[1], "r")) == NULL) {
  149.         fprintf(stderr, "Cannot open %s\n", argv[1]);
  150.         exit(1);
  151.     }
  152.  
  153.     if ((file2 = fopen(argv[2], "r")) == NULL) {
  154.         fprintf(stderr, "Cannot open %s\n", argv[2]);
  155.         exit(1);
  156.     }
  157.  
  158. #ifdef DEBUG
  159.     /* Note: When used with ConMan 0.98B, this opens TWO windows */
  160.     /*       but closes only one. */
  161.     dbgchn = fopen("CON:50/0/540/160/File IO Info", "w");
  162. #endif
  163.  
  164.     if (scanline(file1, line1, &name1, &value1))
  165.         finished = 1;
  166.     else if (scanline(file2, line2, &name2, &value2))
  167.         finished = 2;
  168.  
  169.     while (finished == 0) {
  170.         comp = strcmp(name1, name2);
  171.         if (comp < 0) {    /* First name is lower */
  172.             writeline(name1, value1);
  173.             if (scanline(file1, line1, &name1, &value1))
  174.                 finished = 1;
  175.         } else if (comp > 0) {    /* Second name is lower */
  176.             writeline(name2, value2);
  177.             if (scanline(file2, line2, &name2, &value2))
  178.                 finished = 2;
  179.         } else {    /* Names are the same */
  180.             if (value1 != value2) {    /* Strange... */
  181.                 fprintf(stderr, "*** CONFLICT %s = %8lx %8lx\n",
  182.                     name1, value1, value2);
  183.                 putchar(' ');    /* Make it more visible */
  184.                 writeline(name1, value1);
  185.             }
  186.             writeline(name2, value2);
  187.             if (scanline(file1, line1, &name1, &value1))
  188.                 finished = 1;
  189.             else if (scanline(file2, line2, &name2, &value2))
  190.                 finished = 2;
  191.         }    /* End comparison */
  192.     }    /* End while */
  193.  
  194. #ifdef DEBUG
  195.     fprintf(dbgchn, "***** FINISHED WITH FILE %d *****\n", finished);
  196. #endif
  197.  
  198.     if (finished == 1)    file = file2;
  199.     else                file = file1;
  200.  
  201.     while (!scanline(file, line1, &name1, &value1))    /* Wind up rest of other file */
  202.         writeline(name1, value1);
  203.  
  204.     fclose(file1);
  205.     fclose(file2);
  206.  
  207. #ifdef DEBUG
  208.     fclose(dbgchn);
  209. #endif
  210.     fprintf(stderr, "Terminated successfully\n");
  211. }
  212.